/*
加锁操作比较耗时，整数可以使用原子操作保证线程安全
原子操作在用户态就可以完成，因此性能比互斥锁高
AddXxx()：加减操作
CompareAndSwapXxx()：比较并交换
LoadXxx()：读取操作
StoreXxx()：写入操作
SwapXxx()：交换操作
*/
package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

// 效率对比
// 原子操作需要接收int32或int64
var xf int32
var wdg sync.WaitGroup
var muftex sync.Mutex

// 互斥锁操作
func add1() {
	for i := 0; i < 500; i++ {
		muftex.Lock()
		xf += 1
		muftex.Unlock()
	}
	wdg.Done()
}

// 原子操作
func add2() {
	for i := 0; i < 500; i++ {
		atomic.AddInt32(&xf, 1)
	}
	wdg.Done()
}

func main() {
	start := time.Now()
	for i := 0; i < 10000; i++ {
		wdg.Add(1)
		go add1()
		//go add2()
	}
	wdg.Wait()
	fmt.Println("x:", x)
	fmt.Println("执行时间：", time.Now().Sub(start))
}
